
import 'package:decimal/decimal.dart';
import 'package:intl/intl.dart';
import 'package:lib_core/lib_core.dart';

/// 数字格式化相关方法
/// 固定小数位，即如果小数位不够则补0
/// 金额一般两位小数，为xx.00
@Deprecated('instead use GTNumberFormatV3')
class GTNumberFormat2 {
  /// 将小数转换为百分比 （参数是string类型）
  /// maxFractionDigits:保留的最大小数位（即如果后面是0可以去掉）
  /// 例如：0.031415 -> 3.14%
  /// 0.031495 -> 3.15%
  /// 0.031000 -> 3.1%
  static String decimalStrToPercentage(
    String? decimalStr, {
    int maxFractionDigits = 2,
    bool isCutEndZero = false,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.0001,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
  }) {
    if (null == decimalStr) return '--';
    num? decimal = num.tryParse(decimalStr);
    if (null == decimal) return '--';
    return decimalToPercentage(
      decimal,
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      addPlusWhenPositive: addPlusWhenPositive,
      round: round,
      absMinValueToZero: absMinValueToZero,
    );
  }

  /// 将数字转换为千分位/百万分位/十亿分位,保留指定小数位（参数是String）
  /// 例如：1234567890.12345  -> 1,234,567,890.12
  static String formatNumberStrThousands(
    String? numberStr, {
    // 最大保留小数位数
    int maxFractionDigits = 2,
    // 是否去掉小数位末尾的0，
    bool isCutEndZero = false,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.01,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    if (null == numberStr) return '--';
    num? decimal = num.tryParse(numberStr);
    if (null == decimal) return '--';
    return formatNumberThousands(
      decimal,
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      addPlusWhenPositive: addPlusWhenPositive,
      round: round,
      absMinValueToZero: absMinValueToZero,
      currency: currency,
    );
  }

  /// 将数字转换为K或M，保留指定小数位，（参数是string）
  /// 例如：1,500 = 1.5k，1,500,000 = 1.5m
  static String formatNumberStrKM(
    String? numberStr, {
    // 最大保留小数位数
    int maxFractionDigits = 2,
    // 是否去掉小数位末尾的0，
    bool isCutEndZero = false,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.01,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    if (null == numberStr) return '--';
    num? decimal = num.tryParse(numberStr);
    if (null == decimal) return '--';
    return formatNumberKM(
      decimal,
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      addPlusWhenPositive: addPlusWhenPositive,
      round: round,
      absMinValueToZero: absMinValueToZero,
      currency: currency,
    );
  }

  /// 将小数保留指定小数位（末尾是0则舍弃）（参数是String）
  /// isCutEndZero:是否舍弃末尾的0
  /// round:是否四舍五入,true:四舍五入，false：截断
  /// 例如 3.1415 -> 3.14
  /// 3.1495 -> 3.15
  /// 3.1000 -> 3.1
  static String decimalStrToStringAsFixed(
    String? decimalStr, {
    int maxFractionDigits = 2,
    bool isCutEndZero = false,
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.00,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    if (null == decimalStr) return '--';
    num? decimal = num.tryParse(decimalStr);
    if (null == decimal) return '--';
    return decimalToStringAsFixed(
      decimal,
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      round: round,
      absMinValueToZero: absMinValueToZero,
      currency: currency,
    );
  }

  /// 将小数转换为百分比 （参数是num类型）
  /// maxFractionDigits:保留的最大小数位（即如果后面是0可以去掉）
  /// 例如：0.031415 -> 3.14%
  /// 0.031495 -> 3.15%
  /// 0.031000 -> 3.1%
  static String decimalToPercentage(
    num decimal, {
    int maxFractionDigits = 2,
    bool isCutEndZero = false,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.0001,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
  }) {
    return '${formatNumberThousands(
      (Decimal.parse('$decimal') * Decimal.parse('100')).toDouble(),
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      addPlusWhenPositive: addPlusWhenPositive,
      round: round,
      absMinValueToZero: absMinValueToZero * 100,
    )}%';
  }

  /// 将数字转换为千分位/百万分位/十亿分位,保留指定小数位（参数是num类型）
  /// 例如：1234567890.12345  -> 1,234,567,890.12
  static String formatNumberThousands(
    num number, {
    // 最大保留小数位数
    int maxFractionDigits = 2,
    // 是否去掉小数位末尾的0，
    bool isCutEndZero = false,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.01,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    NumberFormat format = NumberFormat("#,###,###,###,###,##0", Intl.systemLocale);
    format.maximumFractionDigits = maxFractionDigits;
    if(!isCutEndZero){
      format.minimumFractionDigits = maxFractionDigits;  // 确保小数点后最少也有 maxFractionDigits 位数字，不足的补零
    }
    // 是否在数字前面加上'+'号；
    bool isAddPlusSign = (number >= 0 || number.abs() < absMinValueToZero) && addPlusWhenPositive;
    return '${isAddPlusSign ? '+' : ''}${format.format(num.tryParse(decimalToStringAsFixed(
          number,
          maxFractionDigits: maxFractionDigits,
          isCutEndZero: isCutEndZero,
          round: round,
          absMinValueToZero: absMinValueToZero,
          currency: currency,
        )) ?? 0)}';
  }

  /// 将数字转换为K或M，保留指定小数位，(参数是num类型)
  /// 例如：1,500 = 1.5k，1,500,000 = 1.5m
  static String formatNumberKM(
    num number, {
    // 最大保留小数位数
    int maxFractionDigits = 2,
    // 是否去掉小数位末尾的0，
    bool isCutEndZero = true,
    // 是否在前面追加加号-当数字为正数时
    bool addPlusWhenPositive = false,
    // 是否四舍五入,true:四舍五入，false：截断
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.01,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    final language = GTLibCore.globalConfig.language;
    final isChina = language == 'cn' || language == 'tw';
    // 是否在数字前面加上'+'号；
    bool isAddPlusSign = (number >= 0 || number.abs() < absMinValueToZero) && addPlusWhenPositive;
    num result = number;
    String endStr = '';

    if (isChina) {
      if (number.abs() >= 100000000) {
        result = (Decimal.parse('$number') / Decimal.parse('100000000')).toDouble();
        endStr = '亿';
      } else if (number.abs() >= 10000) {
        result = (Decimal.parse('$number') / Decimal.parse('10000')).toDouble();
        endStr = '万';
      }
    } else {
      if (number.abs() >= 1000000) {
        result = (Decimal.parse('$number') / Decimal.parse('1000000')).toDouble();
        endStr = 'M';
      } else if (number.abs() >= 1000) {
        result = (Decimal.parse('$number') / Decimal.parse('1000')).toDouble();
        endStr = 'K';
      }
    }
    return '${isAddPlusSign ? '+' : ''}${decimalToStringAsFixed(
      result,
      maxFractionDigits: maxFractionDigits,
      isCutEndZero: isCutEndZero,
      round: round,
      absMinValueToZero: absMinValueToZero,
      currency: currency,
    )}$endStr';
  }

  /// 将小数保留指定小数位（末尾是0选择舍弃或者补充0）(参数是num)
  /// isCutEndZero:是否舍弃末尾的0
  /// round:是否四舍五入,true:四舍五入，false：截断
  /// 例如 3.1415 -> 3.14
  /// 3.1495 -> 3.15
  /// 3.1000 -> 3.1
  static String decimalToStringAsFixed(
    num decimal, {
    int maxFractionDigits = 2,
    bool isCutEndZero = false,
    bool round = false,
    // 绝对值最小的值，如果值小于此最小值.则使用0
    double absMinValueToZero = 0.00,
    // 币种信息，BTC是小数点后5位，ETH是小数点后7位，其他都是两位
    String? currency,
  }) {
    if (decimal.abs() < absMinValueToZero) {
      decimal = 0;
    }
    if ((currency ?? '').toUpperCase().contains('BTC')) maxFractionDigits = 5;
    if ((currency ?? '').toUpperCase().contains('ETH')) maxFractionDigits = 7;
    String formatterNumber = truncateDecimal(decimal, maxFractionDigits, isRound: round).toString();
    if (isCutEndZero) {
      return Decimal.parse(formatterNumber).toString();
    } else {
      String numberStr = truncateDecimal(decimal, maxFractionDigits, isRound: round).toString();
      Decimal numberDecimal = Decimal.parse(numberStr);
      if (maxFractionDigits == 0) {
        // 不保留小数位
        if (numberStr.contains('.')) {
          // 数字有小数位，则去掉
          return numberStr.substring(0, numberStr.indexOf('.'));
        } else {
          // 数字无小数位,返回
          return numberStr;
        }
      } else {
        final intPart = numberDecimal.toBigInt().abs();
        Decimal decimalPartAdd1 = (Decimal.one + numberDecimal.abs() - intPart.toDecimal()).shift(maxFractionDigits);
        return '${numberDecimal < Decimal.zero ? '-' : ''}$intPart.${decimalPartAdd1.toString().substring(1)}';
      }
    }
  }

  /// 保留指定小数位(返回数值)
  /// isRound:true:四舍五入,false:截断
  static double truncateDecimal(num number, int decimalPlaces, {bool isRound = false}) {
    Decimal decimal = Decimal.tryParse('$number') ?? Decimal.fromInt(0);
    if (isRound) {
      return decimal.round(scale: decimalPlaces).toDouble();
    } else {
      return decimal.truncate(scale: decimalPlaces).toDouble();
    }
  }

  /// 获取小数位数量
  static int getDecimalCount(double number) {
    Decimal decimal = Decimal.parse(number.toString());
    return decimal.scale;
  }
}
